开屏广告
简介
开屏广告主要是 APP 启动时展示的全屏广告视图,开发者只要按照接入标准就能够展示设计好的视图。
注意事项
- 需要确保在SDK初始化成功后再进行广告请求,否则可能导致广告请求加载失败。
- 聚合SDK是通过广告位ID发起广告请求的,切记不要使用混淆;
- 在广告接入前需要明确各ADN对应聚合广告样式情况,以确保正确完成广告接入,避免由于广告类型不匹配导致接入报错等情况的发生。
- 由于各广告平台对于包名校验规则不同,需确保在媒体平台填写的包名符合各ADN平台规范,避免由于包名校验不匹配导致的无广告返回情况的产生。
- 开屏内部相关的视图生命周期由SDK管理,开发者关注CloooudSplashAd对象。当CloooudSplashAd被非法释放时,开屏内部视图会被同时移除释放。
- 接入开屏的最佳实践,在loadSuccess回调中调用show方法展示广告。
- rootViewController建议使用应用当前window对象的rootViewController(keyWindow.rootViewController)或者当前视图控制器的根控制器navigationController(viewController.navigationController)。如果使用新创建的viewController,注意在开屏广告视图控制器关闭回调中splashAdViewControllerDidClose:从当前控制器堆栈中移除viewController。
接入开屏广告
// 创建广告对象
- (void)p_buildAd {
CloooudAdSlot *slot = [[CloooudAdSlot alloc]init];
slot.ID = self.viewModel.slotID; // 聚合功能使用广告位ID;
_splashAd = [[CloooudSplashAd alloc] initWithSlot:slot adSize:CGSizeZero];
_splashAd.delegate = self;
_splashAd.cardDelegate = self;
_splashAd.zoomOutDelegate = self;
}
// 触发广告加载
- (void)p_loadAdData {
[_splashAd loadAdData];
}
// 广告物料、素材加载成功后,会回调splashAdLoadSuccess:方法,
// 在这里调用show方法展示广告
#pragma mark - CloooudSplashAdDelegate
- (void)splashAdLoadSuccess:(nonnull CloooudSplashAd *)splashAd {
// 方式一 使用应用keyWindow的rootViewController(接入简单,推荐)!!!
UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
[splashAd showSplashViewInRootViewController:keyWindow.rootViewController];
// 方式二 使用新创建的视图控制器接入,需要自己管理viewController的展示和关闭!!!
[splashAd showSplashViewInRootViewController:self];
}
// 方式二
- (void)splashAdRenderSuccess:(CloooudSplashAd *)splashAd {
// 渲染成功再展示视图控制器
UIWindow *keyWindow = [[[UIApplication sharedApplication] delegate] window];
[keyWindow.rootViewController addChildViewController:self];
[keyWindow.rootViewController.view addSubview:self.view];
}
//关闭时调用广告销毁方法 避免关闭后广告不移除等异常场景
- (void)splashDidCloseOtherController:(CloooudSplashAd *)splashAd interactionType:(CloooudInteractionType)interactionType {
// 使用聚合功能
[splashAd.mediation destoryAd];
// 只接入CSJ
[self.view removeFromSuperview];
[self removeFromParentViewController];
}
获取展示后广告信息示例
在收到展示回调Visible后访问可获取到正确信息(聚合维度功能)
- (void)logAdInfoAfterShow {
CloooudMRitInfo *info = [self.splashAd.mediation getShowEcpmInfo];
// 展示后可获取信息如下
NSLog(@"ecpm:%@", info.ecpm);// 单位:分
NSLog(@"platform:%@", info.adnName);
NSLog(@"ritID:%@", info.slotID);
NSLog(@"requestID:%@", info.requestID ?: @"None");
NSLog(@"getAdLoadInfoList:%@", [self.splashAd.mediation getAdLoadInfoList]);
}
接口及回调说明
CloooudSplashAd说明
方法名 | 说明 |
---|---|
@property (nonatomic, weak, nullable) id |
开屏广告协议,聚合维度使用CloooudMSplashAdDelegate |
@property (nonatomic, weak, nullable) id |
开屏广告卡片样式协议 |
@property (nonatomic, weak, nullable) id |
开屏广告点睛样式协议 |
@property (nonatomic, assign) BOOL supportZoomOutView; | 是否支持点睛 |
@property (nonatomic, assign) BOOL supportCardView; | 是否支持卡片 |
@property (nonatomic, assign) BOOL hideSkipButton; | 是否隐藏跳过按钮,默认为NO 如果隐藏跳过按钮,则需要自定义倒计时 聚合维度不支持此接口 |
@property (nonatomic, assign) NSTimeInterval tolerateTimeout; | 广告加载超时时间 |
@property (nonatomic, copy, readonly, nonnull) NSString *slotID; | slotID |
@property (nonatomic, copy, readonly) CloooudDictionary *mediaExt; | mediaExt |
@property (nonatomic, weak, readonly, nullable) UIViewController *splashRootViewController; | 开屏视图控制器 |
@property (nonatomic, strong, readonly, nullable) CloooudSplashView *splashView; | 开屏视图 |
@property (nonatomic, strong, readonly, nullable) CloooudSplashCardView *cardView; | 卡片视图 |
@property (nonatomic, strong, readonly, nullable) CloooudSplashZoomOutView *zoomOutView; | 点睛视图 |
@property (nonatomic, strong, readonly, nullable) UIView *splashViewSnapshot; | 开屏最后一帧 聚合维度不支持此接口 |
- (instancetype)initWithSlotID:(NSString *)slotID adSize:(CGSize)adSize; | 初始化方法 聚合不支持此参数接口 |
- (instancetype)initWithSlot:(CloooudAdSlot *)slot adSize:(CGSize)adSize; | 初始化方法 |
- (void)loadAdData; | 加载广告 |
- (void)showSplashViewInRootViewController:(UIViewController *)viewController; | 展示开屏视图 |
- (void)showCardViewInRootViewController:(UIViewController *)viewController; | 展示开屏联动卡片视图 |
- (void)showZoomOutViewInRootViewController:(UIViewController *)viewController; | 展示开屏点睛样式 |
- (void)showZoomOutViewInRootViewController:(UIViewController *)viewController; | 展示开屏点睛视图 |
- (void)removeSplashView; | 自定义跳过按钮场景,移除开屏视图 |
- (NSString *)getAdCreativeToken; | |
@property (nonatomic, strong, nullable, readonly) CloooudSplashAdMediation *mediation; | 当使用聚合广告位时,存在该属性,可获取聚合维度相关功能 |
CloooudSplashAdMediationProtocol说明
方法名 | 说明 |
---|---|
@property (nonatomic, strong, nullable) UIView *customBottomView; | 自定义底部视图,可以设置一些自定义元素,例如LOGO。如果不设置,广告将按照全屏展示。底部视图最大高度不能超过屏幕高度的25%,否则将按照约定最大高度适配 |
- (void)destoryAd; | 销毁广告,建议在不需要展示广告时调用,如close时 |
@property (nonatomic, assign) CloooudMSplashButtonType splashButtonType; | 默认为CloooudMSplashButtonTypeFullScreen只对百度生效 |
@property (nonatomic, assign, readonly) BOOL isReady; | 是否可展示广告,建议在展示广告前判断该字段 |
- (CloooudMRitInfo *)getShowEcpmInfo; | 获取广告展示后相关信息 |
- (CloooudMRitInfo *)getCurrentBestEcpmInfo; | 填充后可调用,返回当前最佳广告的ecpm;当为server bidding ad时访问需要白名单权限;nil为无权限 |
- (NSArray<CloooudMRitInfo > )multiBiddingEcpmInfos; | 填充后可调用,但推荐展示后调用,返回竞价广告的ecpm;当为server bidding ad时访问需要白名单权限;;nil为无权限 |
- (NSArray<CloooudMRitInfo > )cacheRitList; | 填充后可调用, 返回广告缓存池内所有信息;nil为无权限 |
@property (nonatomic, assign, readonly) BOOL isLoading; | 广告是否加载中 |
- (void)addParam:(id)param withKey:(NSString *)key; | 添加参数 param 参数值 key 参数key |
- (NSArray<CloooudMAdLoadInfo > )getAdLoadInfoList; | 一次waterfall中各adn代码位加载广告失败原因,建议调用时机:展示广告时/超时时/全部返回报错时;返回nil表示一次加载无代码位加载失败或其加载无响应 |
CloooudSplashAdDelegate说明
方法名 | 说明 |
---|---|
- (void)splashAdLoadSuccess:(CloooudSplashAd *)splashAd; | 物料加载成功,可以在这个回调中调用show方法展示开屏 |
- (void)splashAdLoadFail:(CloooudSplashAd )splashAd error:(CloooudAdError _Nullable)error; | 物料加载失败,不会展示开屏,提供如下错误码:typedef NS_ENUM(NSInteger, CloooudSplashAdLoadError) {CloooudSplashAdLoadError_UnKnow= 0, //未知错误CloooudSplashAdLoadError_DataError = 1, // 数据加载失败CloooudSplashAdLoadError_TimeOut = 2, // 超时}; |
- (void)splashAdRenderSuccess:(CloooudSplashAd *)splashAd; | load方法调用后,若渲染成功则返回该回调;show方法调用后开屏视图会被添加到ViewController上。 |
- (void)splashAdRenderFail:(CloooudSplashAd )splashAd error:(CloooudAdError _Nullable)error; | load方法调用后,若渲染失败则返回该回调;即使调用show方法开屏视图也不会被添加到ViewController上,提供如下错误码:typedef NS_ENUM(NSInteger, CloooudSplashAdLoadError) {CloooudSplashAdLoadError_UnKnow= 0, //未知错误CloooudSplashAdLoadError_TimeOut = 1, // 超时CloooudSplashAdLoadError_RenderFailed = 2 // 渲染失败}; |
- (void)splashAdWillShow:(CloooudSplashAd *)splashAd; | 广告即将展示回调 |
- (void)splashAdDidShow:(CloooudSplashAd *)splashAd; | 广告展示回调,注意:该回调时机和show埋点上报时机一致 |
- (void)splashAdDidClick:(CloooudSplashAd *)splashAd; | 广告点击回调 |
- (void)splashAdDidClose:(CloooudSplashAd *)splashAd closeType:(CloooudSplashAdCloseType)closeType; | 广告视图会在以下场景关闭:1、开屏未转化关闭(点击跳过、倒计时结束),通知开发者开屏视图已经关闭2、 开屏转化后内开调起市场页,市场页关闭时通知开发者开屏视图已经关闭3、开屏转化其他场景,点击广告后通知开发者开屏视图已经关闭 其他说明:1、广告视图关闭后由SDK移除开屏视图2、closeType标记从哪种场景关闭 |
- (void)splashAdViewControllerDidClose:(CloooudSplashAd *)splashAd; | 如果采用自定义视图控制器展示广告,广告视图控制器会在以下场景关闭:1、开屏未转化关闭(点击跳过、倒计时结束),通知开发者关闭视图控制器2、开屏转化后内跳,中间页、市场页关闭时,通知开发者关闭视图控制器3、开屏转化外跳,即将跳转时,通知开发者关闭视图控制器 |
- (void)splashDidCloseOtherController:(CloooudSplashAd *)splashAd interactionType:(CloooudInteractionType)interactionType; | 广告中间页、市场页面关闭此回调在广告跳转到其他控制器时,该控制器被关闭时调用。interactionType:此参数可区分是打开的appstore/网页/视频广告详情页面 |
- (void)splashVideoAdDidPlayFinish:(CloooudSplashAd )splashAd didFailWithError:(NSError )error; | 当视频广告播放完成或发生错误时调用此方法。 |
CloooudSplashCardDelegate说明
方法名 | 说明 |
---|---|
- (void)splashCardReadyToShow:(CloooudSplashAd *)splashAd; | 开屏卡片样式展示回调 |
- (void)splashCardViewDidClick:(CloooudSplashAd *)splashAd; | 开屏卡片样式点击回调 |
- (void)splashCardViewDidClose:(CloooudSplashAd *)splashAd; | 开屏卡片样式关闭回调 |
CloooudSplashZoomOutDelegate说明
方法名 | 说明 |
---|---|
- (void)splashZoomOutReadyToShow:(CloooudSplashAd *)splashAd; | 开屏点睛样式展示回调 |
- (void)splashZoomOutViewDidClick:(CloooudSplashAd *)splashAd; | 开屏点睛样式点击回调 |
- (void)splashZoomOutViewDidClose:(CloooudSplashAd *)splashAd; | 开屏点睛样式关闭回调 |
CloooudMSplashAdDelegate说明
方法名 | 说明 |
---|---|
- (void)splashAdDidShowFailed:(CloooudSplashAd _Nonnull)splashAd error:(NSError )error; | 广告展示失败回调splashAd 广告管理对象error 展示失败原因 |
- (void)splashAdWillPresentFullScreenModal:(CloooudSplashAd *)splashAd; | 广告即将展示广告详情页回调splashAd 广告管理对象 |
高级功能
首次加载超时解决方案
针对应用首次安装后由于首次调用开屏时聚合广告配置尚未获取导致开屏未能按平台预期设置请求,SDK新增了API给开发者以解决此问题,针对不同广告平台,开发者需要传递广告平台的各项参数给SDK的API,SDK将直接发起请求(只会针对设置的那一家广告平台进行请求,SDK聚合广告配置获取成功后,后续将按照平台配置请求广告)。目前SDK支持的开屏ADN有:CSJ、Mintegral、Ks、GDT、百度、Sigmob。 注意: ①该配置需要在加载广告(loadAd)前设置。
CloooudAdSlot *slot = [[CloooudAdSlot alloc]init];
slot.ID = self.viewModel.slotID;// 代码位ID 仅聚合支持该功能
CloooudMSplashUserData *splashUserData = [[CloooudMSplashUserData alloc]init];
splashUserData.adnName = @"baidu";// adn的名字,请使用如下值 'pangle','baidu','gdt','ks','mtg','sigmob'其他值可能导致无法加载广告
splashUserData.rit = @"xxxxxxxx";// adn对应代码位
splashUserData.appID = @"xxxxxxxx";// adn对应appID
splashUserData.appKey = @"xxxxxxxx";// adn对应appKey, 没有时可不传
slot.mediation.splashUserData = splashUserData;
自定义设置底部logo
开发者可自定义开屏底部View,用于logo展示等个性化设置。自定义底部View的最大高度不得超过屏幕高度的25%,设置值超过则取25%有效值。 该配置需要在加载广告(loadAd)前设置复制
UIView *redCustomBottomView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.width, 50)];
redCustomBottomView.backgroundColor = UIColor.redColor;
_splashAd.mediation.customBottomView = redCustomBottomView; //聚合功能;
本地缓存配置说明
当遇到应用首次安装并且网络拉取配置失败时,客户端表现为请求失错误码40006,可使用此功能。可在平台提前下载瀑布流配置导入到工程中,在SDK初始化时传入下载的json文件。该功能适用于所有广告类型。
接入示例:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
CloooudAdSDKConfiguration *configuration = [CloooudAdSDKConfiguration configuration];
configuration.appID = @"XXXXXX"; //应用ID
configuration.useMediation = YES;//开启聚合功能
configuration.mediation.advanceSDKConfigPath = [[NSBundle mainBundle]pathForResource:@"Cloooud-config-ios-5000546" ofType:@"json"];//导入本地配置文件
return YES;
}
完整接入示例
- (void)loadSplashAd {
CloooudAdSlot *slot = [[CloooudAdSlot alloc] init];
slot.ID = @"广告位ID"; // 聚合维度使用广告位ID
// 兜底广告配置 仅聚合场景支持设置
slot.mediation.splashUserData = ({
CloooudMSplashUserData *splashUserData = [[CloooudMSplashUserData alloc] init];
splashUserData.adnName = @"pangle";
splashUserData.rit = @"代码位ID";
// 设置兜底代码位时,当'adnName = pangle'时'appID'需与初始化时应用ID保持一致
splashUserData.appID = @"应用ID";
splashUserData;
});
CloooudSplashAd *splashAd = [[CloooudSplashAd alloc] initWithSlot:slot adSize:CGSizeZero];
splashAd.delegate = self;
self.splashAd = splashAd;
// 自定义底部视图 聚合功能
self.splashAd.mediation.customBottomView = self.bottomView;
[self.splashAd loadAdData];
}
/******** 开屏广告回调处理 *********/
#pragma mark - CloooudMSplashAdDelegate
// 加载成功
- (void)splashAdLoadSuccess:(nonnull CloooudSplashAd *)splashAd {
// 使用应用keyWindow的rootViewController(接入简单,推荐)
[splashAd showSplashViewInRootViewController:viewController];
}
// 加载失败
- (void)splashAdLoadFail:(nonnull CloooudSplashAd *)splashAd error:(CloooudAdError * _Nullable)error {
}
// 广告即将展示
- (void)splashAdWillShow:(nonnull CloooudSplashAd *)splashAd {
}
// 广告被点击
- (void)splashAdDidClick:(nonnull CloooudSplashAd *)splashAd {
}
// 广告被关闭
- (void)splashAdDidClose:(CloooudSplashAd *)splashAd closeType:(CloooudSplashAdCloseType)closeType {
// 按照实际情况决定是否销毁广告对象
[splashAd.mediation destoryAd];
// 当自己创建新视图控制器接入时,需注意!!!不要在这个回调中关闭控制器,否则会导致中间页无法跳转
}
// 广告展示失败
- (void)splashAdDidShowFailed:(CloooudSplashAd *_Nonnull)splashAd error:(NSError *)error {
}
详细接入可参照demo。